package com.pureut.common.core.message;

import org.apache.commons.lang3.StringUtils;
import org.apache.rocketmq.client.producer.LocalTransactionState;
import org.apache.rocketmq.client.producer.TransactionListener;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;

public class ICBCTransactionListener implements TransactionListener {
    //回调操作方法，消息预提交成功就会触发该方法的执行，用于完成本地事务
    @Override
    public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
        System.out.println("预提交消息成功："+msg);
        //假设收到的TAGA的消息表示扣款成功；TAGB的消息表示扣款失败；
        // TAGC表示扣款结果不清楚，需要执行消息会查
        if(StringUtils.equals("TAGA",msg.getTags())){
            return LocalTransactionState.COMMIT_MESSAGE;//本地事务状态：提交消息
        }else if(StringUtils.equals("TAGB",msg.getTags())){
            return LocalTransactionState.ROLLBACK_MESSAGE;//本地事务状态：回滚消息
        }else if(StringUtils.equals("TAGC",msg.getTags())){
            return LocalTransactionState.UNKNOW;//本地事务状态：未知
        }
        return LocalTransactionState.UNKNOW;
    }

    //消息回查方法
    //引发消息回查的原因有两个：1.回调操作返回UNKNOW，2.TC没有接收到TM的最终全局事务确认指令
    @Override
    public LocalTransactionState checkLocalTransaction(MessageExt msg) {
        System.out.println("执行消息回查"+msg.getTags());
        return LocalTransactionState.COMMIT_MESSAGE;//回查后返回：提交消息
    }
}
